package jp.seraph.jsade.model;

import java.util.List;

import jp.seraph.jsade.core.Player;
import jp.seraph.jsade.effector.EffectorBuilder;
import jp.seraph.jsade.perceptor.ForceResistancePerceptor;
import jp.seraph.jsade.perceptor.GyroPerceptor;
import jp.seraph.jsade.perceptor.HingeJointPerceptor;

/**
 * エージェントモデルを管理するインターフェース。
 */
public interface ModelManager extends ObjectCollection {

    public void modifyModel(HingeJointPerceptor aHingeJoint);

    public void modifyModel(GyroPerceptor aGyro);

    public void modifyModel(ForceResistancePerceptor aFRP);

    public EffectorBuilder createEffectorBuilder();

    /**
     * 現在の情報から、Playerのインスタンスを作成して返す。
     *
     * @return
     */
    public Player createPlayer();

    /**
     * aIdentifierに結び付けられているオブジェクトを返す。
     *
     * @param aIdentifier
     * @throws IllegalArgumentException
     *             渡されたIdentifierが、そのマネージャが対応するもので無い場合に発生する例外
     * @return
     */
    public ModelPart getObject(ModelObjectIdentifier aIdentifier) throws IllegalArgumentException;

    /**
     * このマネージャが保持するすべてのオブジェクトを取得する
     *
     * @return
     */
    public List<ModelPart> getAllObjects();

    /**
     * aIdentifierに結び付けられているジョイントを返す。
     *
     * @param aIdentifier
     * @throws IllegalArgumentException
     *             渡されたIdentifierが、そのマネージャが対応するもので無い場合に発生する例外
     * @return
     */
    public Joint getJoint(JointIdentifier aIdentifier) throws IllegalArgumentException;

    /**
     * このマネージャが保持するすべてのジョイントを取得する
     *
     * @return
     */
    public List<Joint> getAllJoints();

    /**
     * 現在のジャイロの値を取得する
     *
     * @return
     */
    public GyroValue getGyroValue();

    /**
     * 今までのジャイロの値を足し合わせたものを取得する。
     *
     * @return
     */
    public GyroValue getTotalGyroValue();

    /**
     * 左足のセンサが取得した抵抗力を返す。 今後、センサが両足以外についた場合、このメソッドは廃止される可能性があります。
     *
     * @return
     */
    public ForceResistance getLeftFootForceResistance();

    /**
     * 左足のセンサが取得した抵抗力を返す。 今後、センサが両足以外についた場合、このメソッドは廃止される可能性があります。
     *
     * @return
     */
    public ForceResistance getRightFootForceResistance();

    /**
     * ModelManagerに対して新しいターンの開始を通知する。
     * このメソッドはフレームワーク内で使用されることを想定しており、フレームワークを使用するユーザは呼び出すべきではない。
     */
    public void setUpTurn();

    /**
     * ModelManagerに対してターンの終了を通知する
     * このメソッドはフレームワーク内で使用されることを想定しており、フレームワークを使用するユーザは呼び出すべきではない。
     */
    public void tearDownTurn();
}
